package com.ecar.mp.file;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 读取properties文件
 * @author: tianpeng
 */
public class FileOperate {
	
	private Properties properties;
	
	private FileInputStream inputFile;
	
	private FileOutputStream outputFile;
	
	public FileOperate() {
		properties = new Properties();
	}
	
	/**
	 * 初始化Configuration类
	 * @param filePath: 要读取的配置文件的路径+名称
	 */
	public FileOperate(String filePath) {
		properties = new Properties();
		try {
			inputFile = new FileInputStream(filePath);
			properties.load(inputFile);
			inputFile.close();
		} catch (FileNotFoundException ex) {
			System.out.println("读取属性文件失败！");
			ex.printStackTrace();
		} catch (IOException ex) {
			System.out.println("装载文件失败!");
			ex.printStackTrace();
		}
	}

	/**
	 * 重载函数，得到key的值
	 * @param key:取得其值的键
	 * @return key的值
	 */
	public String getValue(String key) {
		if (properties.containsKey(key)) {
			String value = properties.getProperty(key);// 得到某一属性的值
			return value;
		} else
			return "";
	}

	/**
	 * 重载函数，得到key的值
	 * @param filePath:properties文件的路径+文件名
	 * @param key:取得其值的键
	 * @return key的值
	 */
	public String getValue(String filePath, String key) {
		try {
			String value = "";
			inputFile = new FileInputStream(filePath);
			properties.load(inputFile);
			inputFile.close();
			if (properties.containsKey(key)) {
//				value = new String(properties.getProperty(key).getBytes("ISO-8859-1"), "GBK");
				value = new String(properties.getProperty(key));
				return value;
			} else
				return value;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return "";
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		} catch (Exception ex) {
			ex.printStackTrace();
			return "";
		}
	}

	/**
	 * 将能匹配字符串的信息写入Map，保存在内存中
	 * @param filePath:文件路径+文件名称
	 * @param MatchStrKey:要匹配的字符串
	 * @return 一个Map(*.png,10)
	 * @throws Exception
	 */
	public Map<String, String> getMatchStrValue(String filePath, String MatchStrKey) throws Exception {
		Map<String, String> result = new HashMap<String, String>();
		String[] str = null;
		BufferedReader reader = new BufferedReader(new FileReader(filePath));
		String line = reader.readLine();
		while (line != null) {
			if (line.startsWith(MatchStrKey)) {
				str = line.split("=");
				result.put(str[0], str[1]);
			}
			line = reader.readLine();
		}
		reader.close();
		return result;
	}

	/**
	 * 判断文件中是否已经含有子字符串
	 * @param filePath:文件路径+文件名称
	 * @param MatchStrKey:子字符串
	 * @return 布尔型数据(true:含有，false:不含有)
	 */
	public boolean isHaveValue(String filePath, String MatchStrKey) throws Exception {
		BufferedReader reader = new BufferedReader(new FileReader(filePath));
		String line = reader.readLine();
		while (line != null) {
			if (line.startsWith(MatchStrKey)) {
				reader.close();
				return true;
			}
			line = reader.readLine();
		}
		reader.close();
		return false;
	}

	/**
	 * 清除properties文件中所有的key和其值
	 */
	public void clear() {
		properties.clear();
	}

	/**
	 * 改变或添加一个key的值，当key存在于properties文件中时该key的值被value所代替， 当key不存在时，该key的值是value
	 * @param key:要存入的键
	 * @param value:要存入的值
	 */
	public void setValue(String key, String value) {
		properties.setProperty(key, value);
	}

	/**
	 * 将更改后的文件数据存入指定的文件中，该文件可以事先不存在。
	 * @param filePath:文件路径+文件名称
	 * @param description:对该文件的描述
	 */
	public void saveFile(String filePath, String description) {
		try {
			outputFile = new FileOutputStream(filePath);
			properties.store(outputFile, description);
			outputFile.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}

//	public static void main(String[] args) {
//		FileOperate fileOperate = new FileOperate(FilePath.FILE_PATH);
//		fileOperate.setValue("upload", "C:\\Documents and Settings\\j2ee\\MyDocuments\\新建文件夹");
//		fileOperate.saveFile(FilePath.FILE_PATH, "iFile用户路径");
//		String value = fileOperate.getValue(FilePath.FILE_PATH, "upload");
//	}
}